#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define N 5

//创建多个进程
void runChild()
{
  int cnt = 10;
  while(cnt)
  {
    printf("i am child:%d,ppid:%d\n",getpid(),getppid());
    sleep(1);
    cnt--;
  }
}

int main()
{
  int i=0;
  for(i=0;i<N;i++)
  {
    pid_t id = fork();
    if(id==0)
    {
      runChild();
      exit(0);
    }
    //没写else继续返回到循环接着执行
  }
}







/*
int main()
{
  printf("pid:%d before\n",getpid());
  pid_t id = fork();
  if(id == -1)
  {
    printf("fork error\n");
    exit(1);
  }
  printf("after pid:%d return is %d\n",getpid(),id);
  sleep(1);
  return 0;
}
*/
/*
int g_val=100;
int main()
{
  pid_t id =fork();
  if(id==0)
  {
    g_val =200;
    {
      printf("i am child,pid:%d,ppid:%d,g_val:%d,&g_val:%p\n",getpid(),getppid(),g_val,&g_val);
    }
   }
    else
    {
      sleep(1);
      printf("i am parent,pid:%d,ppid:%d,g_val:%d,&g_val:%p\n",getpid(),getppid(),g_val,&g_val);
    }
    return 0;
}
*/

/*
int g_val=100;
int main()
{
  pid_t id=fork();
  if(id==0)
  {
    //子进程
    int cnt=3;
    while(1)
    {
      printf("i am child,pid:%d,ppid:%d,g_val:%d,&g_val:%d\n",getpid(),getppid(),g_val,&g_val);
      sleep(1);
      if(cnt) cnt--;
      else 
      {
        g_val=200;
        printf("子进程change g_val：100->200\n");
        cnt--;
      }
     }
   }
  else
  {
    //父进程
      while(1)
      {
      printf("i am parent,pid:%d,ppid:%d,g_val:%d,&g_val:%d\n",getpid(),getppid(),g_val,&g_val);
      sleep(1);  
      }
  }
}
*/

/*
int g_val_1;
int g_val_2=100;
int main()
{
  printf("code addr:%p\n",main);  //用main函数充当代码区地址 

  const char* str = "hello linux";
  printf("read only string addr:%p\n",str); //只读常量区，打印数组名代表数组首地址即可，不用取地址和解引用

  printf("init golbal val addr:%p\n",&g_val_2); //初始化数据

  printf("uninit init golbal val addr:%p\n",&g_val_1);  //未初始化数据

  char *ch=(char*)malloc(100);
  printf("heap addr:%p\n",&ch); //堆区

  printf("stack addr:%p\n",&str); //栈区
  return 0;
}
  int a,b,c;

  printf("stack addr:%p\n",&a);
  printf("stack addr:%p\n",&b);
  printf("stack addr:%p\n",&c);

 // char *str="hello Linux";
 // *str='x';
 // 如上str保存的是该字符串的起始地址h，改变第一个字符h为x，因为字符只有只读属性不能更改，编译可以通过，运行不行
 }
*/
